import type { UnistNode, UnistTree } from "types/unist"
import { visit } from "unist-util-visit"

export function rehypeNpmCommand() {
   return (tree: UnistTree) => {
      visit(tree, (node: UnistNode) => {
         if (node.type !== "element" || node?.tagName !== "pre") {
            return
         }

         // npm install.
         if (node.properties?.__rawString__?.startsWith("npm install")) {
            const npmCommand = node.properties?.__rawString__
            node.properties.__npmCommand__ = npmCommand
            node.properties.__yarnCommand__ = npmCommand.replace(
               "npm install",
               "yarn add",
            )
            node.properties.__pnpmCommand__ = npmCommand.replace(
               "npm install",
               "pnpm add",
            )
            node.properties.__bunCommand__ = npmCommand.replace(
               "npm install",
               "bun add",
            )
         }

         // npx create.
         if (node.properties?.__rawString__?.startsWith("npx create-")) {
            const npmCommand = node.properties?.__rawString__
            node.properties.__npmCommand__ = npmCommand
            node.properties.__yarnCommand__ = npmCommand.replace(
               "npx create-",
               "yarn create ",
            )
            node.properties.__pnpmCommand__ = npmCommand.replace(
               "npx create-",
               "pnpm create ",
            )
            node.properties.__bunCommand__ = npmCommand.replace(
               "npx",
               "bunx --bun",
            )
         }

         // npx.
         if (
            node.properties?.__rawString__?.startsWith("npx") &&
            !node.properties?.__rawString__?.startsWith("npx create-")
         ) {
            const npmCommand = node.properties?.__rawString__
            node.properties.__npmCommand__ = npmCommand
            node.properties.__yarnCommand__ = npmCommand
            node.properties.__pnpmCommand__ = npmCommand.replace(
               "npx",
               "pnpm dlx",
            )
            node.properties.__bunCommand__ = npmCommand.replace(
               "npx",
               "bunx --bun",
            )
         }
      })
   }
}
